package Chapter8;
//189页程序8.18
//动作侦听程序+swing组件+awt的绘图Graphic类

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawingExample implements ActionListener {
    JFrame frame; //框架
    MyButton button; //自定义按钮，继承自JButton
    MyPanel panel; //自定义面板，继承自JPanel
    int tag = 1; //用来清除图形还是重绘，可设为static静态变量，这样便无需DrawingExample实例化也可被访问

    public static void main(String[] args) {
        DrawingExample de = new DrawingExample();
        de.go();
    }

    public void go() {
        frame = new JFrame("绘图程序"); //创建框架
        button = new MyButton("绘图"); //创建自定义按钮
        button.addActionListener(this); //为按钮添加侦听程序，侦听程序对象就是DrawingExample的实例de
        frame.getContentPane().add(button, "South"); //获取内容窗格，将按钮添加进去，置到下方

        panel = new MyPanel(); //创建一个面板
        frame.getContentPane().add(panel, "Center");
        frame.setBounds(600,300,600, 400);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    @Override
    public void actionPerformed(ActionEvent e) { //实现接口的方法
        if (tag == 0) {
            tag = 1; //当点击按钮后，将tag置1
            button.setText("绘图"); //按钮的文本为绘图
        } else {
            tag = 0;
            button.setText("清除");
        }
        panel.repaint(); //通过该方法来重绘图形，当tag改变则展示图形或不展示图形
    }

    class MyButton extends JButton {
        MyButton(String text) { //MyButton继承了JButton的功能，这是它的构造方法
            super(text); //调用父类，展示标题
        }

        protected void paintComponent(Graphics g) { //组件重写了父类的paintComponent方法
            super.paintComponent(g); //先调用父类的paintComponent方法，默认绘制空白。Graphics是抽象父类，不能创建实例对象，因此系统自动创建绘图对象g
            g.setColor(Color.RED); //设置前景色为红色
            int width = getWidth(); //得到按钮组件的宽和高
            int height = getHeight();
            g.drawOval(4, 4, width - 8, height - 8);
            //在组件上画一个椭圆，颜色为前景色红色，fillOval为带填充，此处drawOval是不带填充的椭圆，即轮廓
        }
    }

    class MyPanel extends JPanel { //在自定义面板MyPanel中绘图，继承自JPanel
        protected void paintComponent(Graphics g) {  //组件重写了父类的paintComponent方法
            super.paintComponent(g); //调用父类的paintComponent方法，默认绘制空白
            int[] x_points = {280, 300, 320, 290, 260}; //用来绘制折线图的x坐标的数组
            int[] y_points = {120, 120, 130, 150, 130}; //用来绘制折线图的y坐标的数组
            if (tag == 0) {
                g.setColor(Color.RED);
                g.drawLine(40, 25, 30, 50); //画直线

                g.setColor(Color.CYAN);
                g.fillPolygon(x_points, y_points, 5); //多个点的连接线 drawPolygon为无填充 nPoints为有多少个顶点

                g.setColor(Color.ORANGE);
                g.drawRect(100, 50, 100, 46); //画矩形

                g.setColor(Color.BLACK);
                g.fillRect(50, 120, 80, 30); //带填充的矩形

                g.setColor(Color.YELLOW);
                g.drawRoundRect(73, 32, 56, 37, 10, 16); //画圆角矩形

                g.setColor(Color.MAGENTA);
                g.fillRoundRect(10, 110, 80, 30,10,10); //带填充的圆角矩形

                g.setColor(Color.BLUE);
                g.drawArc(250, 32, 90, 60, 15, 30); //弧线

                g.setColor(Color.BLUE);
                g.fillArc(270, 72, 90, 60, 15, 30); //带填充的弧线

                g.setColor(Color.GREEN);
                g.drawOval(280, 160, 60, 45); //画外接矩形的椭圆

                g.setColor(Color.GREEN);
                g.fillOval(180, 60, 60, 45); //画带填充外接矩形的椭圆

                g.setXORMode(Color.PINK); //设置异或绘图模式 不同颜色的重叠部分会产生新颜色pink，相同颜色的重叠部分会覆盖原颜色
                g.fillOval(90, 130, 80, 30);
            }
        }
    }
}